package com.malou.client;


import java.util.List;

import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.Style.Scroll;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MessageBoxEvent;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.util.Theme;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.TabPanel;
import com.extjs.gxt.ui.client.widget.Text;
import com.extjs.gxt.ui.client.widget.Viewport;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.layout.CenterLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.HBoxLayout;
import com.extjs.gxt.ui.client.widget.layout.HBoxLayoutData;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.ClosingEvent;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RootPanel;
import com.malou.client.graficosestadisticos.GPrendaVendidaxFechaPanel;
import com.malou.client.graficosestadisticos.GPrendasVendidasxDiaPanel;
import com.malou.client.graficosestadisticos.GPrendasVendidasxFechaPanel;
import com.malou.client.graficosestadisticos.PrendaVendidaxFechaPanel;
import com.malou.client.graficosestadisticos.PrendasVendidasxDiaPanel;
import com.malou.client.graficosestadisticos.PrendasVendidasxFechaPanel;
import com.malou.client.reportes.GPrendasVendidasPanel;
import com.malou.client.reportes.GReporteIngresosTallerPanel;
import com.malou.client.reportes.GReporteInventarioPanel;
import com.malou.client.reportes.GReporteSaldosPanel;
import com.malou.client.reportes.GReporteStockPanel;
import com.malou.client.reportes.GReporteVentasPanel;
import com.malou.client.reportes.PrendasVendidasPanel;
import com.malou.client.reportes.ReporteEntradasPanel;
import com.malou.client.reportes.ReporteIngresosTallerPanel;
import com.malou.client.reportes.ReporteInventarioPanel;
import com.malou.client.reportes.ReporteSaldosPanel;
import com.malou.client.reportes.ReporteSalidasPanel;
import com.malou.client.reportes.ReporteStockPanel;
import com.malou.client.reportes.ReporteVentasPanel;
import com.malou.client.reportes.ResumenPanel;
import com.malou.client.seguridad.login.LoginDialog;
import com.malou.client.seguridad.menu.MenuLateral;
import com.malou.client.seguridad.menu.MenuOpciones;
import com.malou.client.seguridad.menu.MenuPanel;
import com.malou.client.seguridad.usuario.Usuarios;
import com.malou.client.ventas.cajainicial.CajaInicialForm;
import com.malou.client.ventas.cliente.ClientePanel;
import com.malou.client.ventas.gasto.GastoPanel;
import com.malou.client.ventas.modeloprenda.ModeloPrendaPanel;
import com.malou.client.ventas.movimiento.entrada.MovimientoEntradaPanel;
import com.malou.client.ventas.movimiento.salida.MovimientoSalidaPanel;
import com.malou.client.ventas.proveedor.ProveedorPanel;
import com.malou.client.ventas.separacion.SeparacionPanel;
import com.malou.client.ventas.serie.SeriePanel;
import com.malou.client.ventas.tienda.TiendaPanel;
import com.malou.client.ventas.tipoprendas.TipoPrendaPanel;
import com.malou.client.ventas.venta.VentaPanel;

public class Malou implements EntryPoint {
	
	String startingToken = "";
	public TabPanel center;
	private MenuLateral panel;
	private MalouConstants constants = GWT.create(MalouConstants.class);
	public Label tienda;
	public Label usuario;
	Viewport viewport;
	public LayoutContainer north;
	
	public Integer usuario_logueado_id;
	public boolean superusuario;
	public List<String> permisos;
	
	private Timer sessionTimeoutResponseTimer;
    private MyServiceAsync service = GWT.create(MyService.class);;
    private final int INITIAL_TIMEOUT_PAD = 60000;    
    private final int TIMEOUT_PAD = 15000; 
		
	public void onModuleLoad() {
		initSessionTimers();
		
		Window.setTitle(constants.sistemaMarcocruzado());
		
		GXT.setDefaultTheme(Theme.BLUE, false);
		
		Usuarios.malou = this;
		Usuarios.checkSession();
		
		GXT.hideLoadingPanel("loading");
	}
		
	public void loadLogin() {
	    LoginDialog dialog = new LoginDialog();
	    dialog.setClosable(false);
	    
	    dialog.show();
	}
	
	public void dolayout(){		
		BorderLayout bl = new BorderLayout();
		viewport = new Viewport();
		viewport.setLayout(bl);
		
		north = new LayoutContainer();
		
		ContentPanel west = new ContentPanel();
		west.setHeading(constants.principalTienda());
		panel = new MenuLateral(usuario_logueado_id);
		panel.malou = this;
		west.setScrollMode(Scroll.AUTOY);
	    west.add(panel);
	    center = new TabPanel();
	    
	    center.setMinTabWidth(115);  
	    
	    center.setAnimScroll(true);  
	    center.setTabScroll(true);
	    center.setCloseContextMenu(true);
	    TabItem tabItem = new TabItem(constants.principalInicio());
//	    
//	    List<String> images = new ArrayList<String>();	    
//	    images.add(GWT.getHostPageBaseURL()+"upload/img/sistemaventas.png");
//	    images.add(GWT.getHostPageBaseURL()+"upload/img/sistemamovil.png");	
//	    final SlideShow slideshow = new SlideShow(images);
//	    slideshow.addListener(SlideShowEvents.PictureChange, new Listener<SlideShowEvent>() {
//
//			@Override
//			public void handleEvent(SlideShowEvent se) {
//				String image = se.getImage();
//				
//			}
//		});
//	    
//	    Draggable d = new Draggable(slideshow);
//	    Resizable r = new Resizable(slideshow);
//	    r.setDynamic(true);
//	    
//	    slideshow.setSize(884, 233);
//	    Button start = new Button("start");
//	    start.addSelectionListener(new SelectionListener<ButtonEvent>() {
//			
//			@Override
//			public void componentSelected(ButtonEvent ce) {
//				slideshow.start(10);
//			}
//		});
//	    tabItem.add(start);
//	    
//	    Button stop = new Button("stop");
//	    stop.addSelectionListener(new SelectionListener<ButtonEvent>() {
//			
//			@Override
//			public void componentSelected(ButtonEvent ce) {
//				slideshow.stop();
//			}
//		});
//	    tabItem.add(stop);
//	    
//	    MouseGesturePlugin mg = new MouseGesturePlugin() {
//			
//			@Override
//			protected void onGestureRight() {
//				slideshow.next();
//			}
//			
//			@Override
//			protected void onGestureLeft() {
//				slideshow.prev();
//			}
//		};
//		slideshow.addPlugin(mg);
//	    tabItem.add(slideshow);
//	    
	    center.add(tabItem);
	    center.setBounds(10,10,300,300);
		
		BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH, 30);
						
		BorderLayoutData westData = new BorderLayoutData(LayoutRegion.WEST, 200);
		westData.setCollapsible(true);
		westData.setFloatable(true);
		westData.setSplit(true);
		westData.setMargins(new Margins(5, 0, 5, 5));
		
		BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);
		centerData.setMargins(new Margins(5));
		
		viewport.add(north, northData);
		viewport.add(west, westData);
		viewport.add(center, centerData);
		
		RootPanel.get().add(viewport);
	}

	public void loadProgram(TabItem pti){
		String parametro = pti.getItemId();
		if(parametro.equals("tiendas")){
			TiendaPanel tiendapanel = new TiendaPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				tiendapanel.setPermisos(permisos);
			pti.add(tiendapanel);
		}else if(parametro.equals("menus")){
			MenuPanel menupanel = new MenuPanel();
			pti.setLayout(new FitLayout());			
			pti.add(menupanel);
		}else if(parametro.equals("clientes")){
            ClientePanel clientepanel = new ClientePanel();
            pti.setLayout(new FitLayout());
            if(!superusuario && permisos != null)
            	clientepanel.setPermisos(permisos);
            pti.add(clientepanel);
		}else if(parametro.equals("proveedores")){
            ProveedorPanel proveedorpanel = new ProveedorPanel();
            pti.setLayout(new FitLayout());
            if(!superusuario && permisos != null)
            	proveedorpanel.setPermisos(permisos);
            pti.add(proveedorpanel);
		}else if(parametro.equals("tipoprendas")){
            TipoPrendaPanel tipoprendapanel = new TipoPrendaPanel();
            pti.setLayout(new FitLayout());
            if(!superusuario && permisos != null)
            	tipoprendapanel.setPermisos(permisos);
            pti.add(tipoprendapanel);
		}else if(parametro.equals("series")){
            SeriePanel seriepanel = new SeriePanel();
            pti.setLayout(new FitLayout());
            if(!superusuario && permisos != null)
            	seriepanel.setPermisos(permisos);
            pti.add(seriepanel);
		}else if(parametro.equals("modeloprendas")){
			ModeloPrendaPanel modeloprendapanel = new ModeloPrendaPanel();
            pti.setLayout(new FitLayout());            
            if(!superusuario && permisos != null)
            	modeloprendapanel.setPermisos(permisos);
            pti.add(modeloprendapanel);
            
            /*pti.addListener(Events.Close, new Listener<BaseEvent>() {

				@Override
				public void handleEvent(BaseEvent be) {
					//System.out.println("cerrrar");
					ModeloPrendas.noescuchar();
				}
			});*/
		}else if(parametro.equals("cajainicial")){			
            pti.setLayout(new CenterLayout());            
            pti.add(new CajaInicialForm());
            
		}else if(parametro.equals("ventas")){
			VentaPanel ventapanel = new VentaPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				ventapanel.setPermisos(permisos);
			pti.add(ventapanel);
		}else if(parametro.equals("entrada")){
			MovimientoEntradaPanel movimientoentradapanel = new MovimientoEntradaPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				movimientoentradapanel.setPermisos(permisos);
			pti.add(movimientoentradapanel);
		}else if(parametro.equals("salida")){
			MovimientoSalidaPanel movimientosalidapanel = new MovimientoSalidaPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				movimientosalidapanel.setPermisos(permisos);
			pti.add(movimientosalidapanel);
		}else if(parametro.equals("separaciones")){
			SeparacionPanel separacionpanel = new SeparacionPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				separacionpanel.setPermisos(permisos);
			pti.add(separacionpanel);
		}else if(parametro.equals("gastos")){
			GastoPanel gastopanel = new GastoPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				gastopanel.setPermisos(permisos);
			pti.add(gastopanel);
		}else if(parametro.equals("resumen")){
			ResumenPanel resumenpanel = new ResumenPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				resumenpanel.setPermisos(permisos);
			pti.add(resumenpanel);
		}else if(parametro.equals("prendasvendidas")){
			PrendasVendidasPanel prendasvendidaspanel = new PrendasVendidasPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				prendasvendidaspanel.setPermisos(permisos);
			pti.add(prendasvendidaspanel);
		}else if(parametro.equals("reporteventas")){
			ReporteVentasPanel reporteventas = new ReporteVentasPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				reporteventas.setPermisos(permisos);
			pti.add(reporteventas);
		}else if(parametro.equals("reportestock")){
			ReporteStockPanel reportestock = new ReporteStockPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				reportestock.setPermisos(permisos);
			pti.add(reportestock);
		}else if(parametro.equals("reporteinventario")){
			ReporteInventarioPanel reporteinventario = new ReporteInventarioPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				reporteinventario.setPermisos(permisos);
			pti.add(reporteinventario);
		}else if(parametro.equals("ingresostaller")){
			ReporteIngresosTallerPanel reporteingresos = new ReporteIngresosTallerPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				reporteingresos.setPermisos(permisos);
			pti.add(reporteingresos);
		}else if(parametro.equals("reportesaldos")){
			ReporteSaldosPanel reportesaldos = new ReporteSaldosPanel();
			pti.setLayout(new FitLayout());	
			if(!superusuario && permisos != null)
				reportesaldos.setPermisos(permisos);
			pti.add(reportesaldos);
		}else if(parametro.equals("movimientoentradas")){
			ReporteEntradasPanel reporteentradas = new ReporteEntradasPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				reporteentradas.setPermisos(permisos);
			pti.add(reporteentradas);
		}else if(parametro.equals("movimientosalidas")){
			ReporteSalidasPanel reportesalidas = new ReporteSalidasPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				reportesalidas.setPermisos(permisos);
			pti.add(reportesalidas);
		}else if(parametro.equals("gprendasvendidas")){
			GPrendasVendidasPanel gprendasvendidaspanel = new GPrendasVendidasPanel();
			pti.setLayout(new FitLayout());			
			pti.add(gprendasvendidaspanel);
		}else if(parametro.equals("greporteventas")){
			GReporteVentasPanel greporteventas = new GReporteVentasPanel();
			pti.setLayout(new FitLayout());			
			pti.add(greporteventas);
		}else if(parametro.equals("greportestock")){
			GReporteStockPanel greportestock = new GReporteStockPanel();
			pti.setLayout(new FitLayout());			
			pti.add(greportestock);
		}else if(parametro.equals("greporteinventario")){
			GReporteInventarioPanel greporteinventario = new GReporteInventarioPanel();
			pti.setLayout(new FitLayout());			
			pti.add(greporteinventario);
		}else if(parametro.equals("gingresostaller")){
			GReporteIngresosTallerPanel greporteingresos = new GReporteIngresosTallerPanel();
			pti.setLayout(new FitLayout());			
			pti.add(greporteingresos);
		}else if(parametro.equals("greportesaldos")){
			GReporteSaldosPanel greportesaldos = new GReporteSaldosPanel();
			pti.setLayout(new FitLayout());		
			pti.add(greportesaldos);
		}else if(parametro.equals("prendasvendidasxdia")){
			PrendasVendidasxDiaPanel prendasvendidasxdia = new PrendasVendidasxDiaPanel();
			pti.setLayout(new FitLayout());
			if(!superusuario && permisos != null)
				prendasvendidasxdia.setPermisos(permisos);
			pti.add(prendasvendidasxdia);
		}else if(parametro.equals("gprendasvendidasxdia")){
			GPrendasVendidasxDiaPanel gprendasvendidasxdia = new GPrendasVendidasxDiaPanel();
			pti.setLayout(new FitLayout());		
			pti.add(gprendasvendidasxdia);
		}else if(parametro.equals("prendavendidaxfecha")){
			PrendaVendidaxFechaPanel prendavendidaxfecha = new PrendaVendidaxFechaPanel();
			pti.setLayout(new FitLayout());	
			if(!superusuario && permisos != null)
				prendavendidaxfecha.setPermisos(permisos);
			pti.add(prendavendidaxfecha);
		}else if(parametro.equals("ventasxfecha")){
			PrendasVendidasxFechaPanel prendasvendidaxfecha = new PrendasVendidasxFechaPanel();
			pti.setLayout(new FitLayout());	
			if(!superusuario && permisos != null)
				prendasvendidaxfecha.setPermisos(permisos);
			pti.add(prendasvendidaxfecha);
		}else if(parametro.equals("gventasxfecha")){
			GPrendasVendidasxFechaPanel gprendasvendidaxfecha = new GPrendasVendidasxFechaPanel();
			pti.setLayout(new FitLayout());			
			pti.add(gprendasvendidaxfecha);
		}else if(parametro.equals("gprendavendidaxfecha")){
			GPrendaVendidaxFechaPanel gprendavendidaxfecha = new GPrendaVendidaxFechaPanel();
			pti.setLayout(new FitLayout());			
			pti.add(gprendavendidaxfecha);
		}else
			pti.addText(pti.getItemId()); // el id del tab es el parametro 
		
		pti.addListener(Events.Select, new Listener<ComponentEvent>(){
			@Override
			public void handleEvent(ComponentEvent be) {
				TabPanel tp= (TabPanel)be.getSource();
				tp.getSelectedItem().getData("selectItem");
				
				MenuOpciones mn = (MenuOpciones)tp.getSelectedItem().getData("itemmenu");				
				panel.tree.getSelectionModel().deselectAll();
				panel.tree.getSelectionModel().select(mn, true);
				
			}			
		});		
	}
	
	public void addButtonExit(String tiendaName, String responsable){
		
		HBoxLayout layout = new HBoxLayout();
		
		north.setLayout(layout);
		Text text = new Text(constants.sistemaMarcocruzado());
		text.addStyleName("appTitle");
		north.add(text, new HBoxLayoutData());		
		HBoxLayoutData flex = new HBoxLayoutData();  
        flex.setFlex(1);  
        north.add(new Text(), flex);
        
        tienda = new Label(tiendaName);
        tienda.addStyleName("appTienda");
        north.add(tienda,new HBoxLayoutData(new Margins(8, 5, 0, 0)));
        
        usuario = new Label(responsable);
        usuario.addStyleName("appUsuario");
        north.add(usuario,new HBoxLayoutData(new Margins(8, 5, 0, 0)));
        
        Label logout = new Label(constants.logout());
        logout.addStyleName("appLogout");
        logout.addListener(Events.OnClick, new Listener<BaseEvent>() {

			@Override
			public void handleEvent(BaseEvent be) {			
				Usuarios.logout();	
				RootPanel.get().clear();
				loadLogin();
				sessionTimeoutResponseTimer.cancel();
			}
        	
		});
        north.add(logout,new HBoxLayoutData(new Margins(8, 5, 0, 0)));
		north.addStyleName("appHeading");
		north.layout();
		
		
	}
	
	private void initSessionTimers()
    {
        
        service.getUserSessionTimeout(new AsyncCallback<Integer>()
        {
            public void onSuccess(Integer timeout)
            {
                sessionTimeoutResponseTimer = new Timer()
                {
                    @Override
                    public void run()
                    {
                        checkUserSessionAlive();
                    }
                };
                sessionTimeoutResponseTimer.schedule(timeout+INITIAL_TIMEOUT_PAD);
            }

            public void onFailure(Throwable caught)
            {
                displaySessionTimedOut();
            }
        });
        
        Window.addWindowClosingHandler(new Window.ClosingHandler(){
			@Override
			public void onWindowClosing(ClosingEvent event){
			 //event.setMessage("Desea Salir del Sistema?");
				//System.out.println("cerrando");			 	
				Usuarios.logout();
				//event.setMessage("Desea Salir del Sistema?");
				
			}
		}); 
		
		Window.addCloseHandler(new CloseHandler<Window>() {
			
			@Override
			public void onClose(CloseEvent<Window> arg0) {
				//System.out.println("cerrado");
				//Window.alert("detenido por juan");
				//ModeloPrendas.noescuchar();
				//Usuarios.logout();
			}
		});
    }

    private void checkUserSessionAlive()
    {
        service.getUserSessionTimeout(new AsyncCallback<Integer>()
        {
            public void onSuccess(Integer timeout)
            {
                sessionTimeoutResponseTimer.cancel();
                sessionTimeoutResponseTimer.schedule(timeout+TIMEOUT_PAD);
            }

            public void onFailure(Throwable caught)
            {
                displaySessionTimedOut();
            }
        });

    }

    private void displaySessionTimedOut()
    {
        MessageBox.alert(
        		constants.sistemaMarcocruzado(),
        		constants.suSessionHaExpirado(),
                new Listener<MessageBoxEvent>()
        {

            public void handleEvent(MessageBoxEvent be) {
                Window.Location.reload();
            }
        });
    }
	

}
